package request

import (
	"ai-cli/config"
	"ai-cli/utils"
	"bytes"
	"encoding/json"
	"fmt"
	"io"
	"net/http"
)

const qwenURL = "https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions"

type ChatMessage struct {
	Role    string `json:"role"`
	Content string `json:"content"`
}

type ChatRequest struct {
	Model    string        `json:"model"`
	Messages []ChatMessage `json:"messages"`
}

type ChatResponse struct {
	Choices []struct {
		Message ChatMessage `json:"message"`
	} `json:"choices"`
}

// CallQwenChat 向阿里云 Qwen 模型发送对话请求
func CallQwenChat(userMessage string) (string, error) {
	apiKey := config.UserConfig.GetString("API_KEY")
	if apiKey == "" {
		return "", fmt.Errorf("请设置你的keys AICMD_API_KEY\r\naicmd setKey '你的key'")
	}
	prompt := "你是一个专业的命令生成工具，名为 aicmd。你的核心功能是：根" +
		"据用户输入的自然语言需求，生成可直接在对应操作系统（如 Linux、Windows、macOS）中运行的命令。\n\n生成命令需严格遵循以下规则：\n\n准确性：命令必须语法正确、参数完整，确保复制后能直接执行并达成用户需求。\n环境适配：优先根据用户暗示的操作系统生成对应命令（如用户提 “cmd” 则生成 Windows 命令，提 “bash” 则生成 Linux 命令）；若未明确，可生成多系统版本并标注。\n简洁性：避免冗余参数，在满足需求的前提下使用最精简的命令形式。\n安全性：默认生成安全操作命令（如删除文件时避免递归删除根目录等危险操作" +
		"，必要时添加提示性注释）。\n示例：用户输入：查看当前目录下所有文件（包括隐藏文件）dir /a ,你不能输出除了命令以外的其他文本。我的操作系统环境是:" + utils.GetOS()
	reqData := ChatRequest{
		Model: "qwen-plus",
		Messages: []ChatMessage{
			{Role: "system", Content: prompt},
			{Role: "user", Content: userMessage},
		},
	}

	reqBody, _ := json.Marshal(reqData)

	req, err := http.NewRequest("POST", qwenURL, bytes.NewBuffer(reqBody))
	if err != nil {
		return "", err
	}
	req.Header.Set("Authorization", "Bearer "+apiKey)
	req.Header.Set("Content-Type", "application/json")

	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		return "", err
	}
	defer resp.Body.Close()

	bodyBytes, _ := io.ReadAll(resp.Body)
	if resp.StatusCode != 200 {
		return "", fmt.Errorf("接口错误: %s", string(bodyBytes))
	}

	var result ChatResponse
	if err := json.Unmarshal(bodyBytes, &result); err != nil {
		return "", err
	}

	if len(result.Choices) == 0 {
		return "", fmt.Errorf("无返回结果")
	}

	return result.Choices[0].Message.Content, nil
}
